﻿package hibernate.xml44.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateHandler {
	private static SessionFactory sessionFactory;
	private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	static{
		/*--->hibernate的核心接口<---
		 * 1.Configuration类
		 * 该类负责管理hibernate的配置信息,读取hibernate.cfg.xml,管理关系映射文件*.hbm.xml
		 * 2.SessionFactory(会话工厂)
		 * 是一个重量级的类(吃内存),一般使用单例模式保证一个应用一个SessionFactory
		 * 如果一个应用要使用多个数据库,那么一个数据库创建一个SessionFactory
		 * 通过此接口可以获取Session
		 * */
		sessionFactory = new Configuration().configure().buildSessionFactory();
	}
	/*--->hibernate的核心接口<---
	 * Session(会话)
	 * 1.通过openSession来获取Session
	 * 2.通过getCurrentSession获取Session
	 * 区别：后者创建的Session会绑定到当前线程中,前者每次获取新的Session
	 *       后者创建的Session在commit或rollbaack时会自动关闭,前者需要手动关闭
	 *       使用getCurrentSession创建Session需要在hibernate.cfg.xml中加入如下配置
	 *       a.jdbc事务(本地)
	 *       <property name="hibernate.current_session_context_class">thread</property>
	 *       b.jta事务(全局)
	 *       <property name="hibernate.current_session_context_class">jta</property>
	 *       全局是指要操作多数据库(比如在A数据库中减操作,同时在B数据库中加操作)
	 * 选择：如果在同一线程中要使用不同的Session则使用openSession,否则反之
	 * */
	/*获取全新Session*/
	public static Session getSession(){
		Session session = sessionFactory.openSession();
		return session;
	}
	/*获取线程级Session*/
	public static Session getCurrentSession(){
		Session session = threadLocal.get();
		if(session==null){
			session = sessionFactory.openSession();
			threadLocal.set(session);
		}
		return session;
	}
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	
}
